/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.usbcali.proyectofinal.logica;

import co.edu.usbcali.proyectofinal.dao.IClientesDAO;
import co.edu.usbcali.proyectofinal.dao.ITiposDocumentosDAO;
import co.edu.usbcali.proyectofinal.modelo.Clientes;
import co.edu.usbcali.proyectofinal.modelo.TiposDocumentos;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author alejandro
 */
@Scope("singleton")
@Service
public class ClientesLogica implements IClientesLogica {

    @Autowired
    private IClientesDAO clientesDAO;

    @Autowired
    private ITiposDocumentosDAO tiposDocumentosDAO;

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void crearCliente(Clientes clientes) throws Exception {
        if (clientes == null) {
            throw new Exception("El cliente es nulo");
        }
        if (clientes.getCliDireccion() == null || clientes.getCliDireccion().trim().equals("")) {
            throw new Exception("La Direccion es obligatoria");
        }
        if (clientes.getCliId() == 0) {
            throw new Exception("El ID es obligatorio");
        }
        if (clientes.getCliMail() == null || clientes.getCliMail().trim().equals("")) {
            throw new Exception("El Email es obligatorio");
        }
        if (clientes.getCliNombre() == null || clientes.getCliNombre().trim().equals("")) {
            throw new Exception("El nombre del cliente es obligatorio");
        }
        if (clientes.getCliTelefono() == null || clientes.getCliTelefono().trim().equals("")) {
            throw new Exception("El telefono del cliente es obligatorio");
        }
        if (clientes.getTiposDocumentos() == null || clientes.getTiposDocumentos().getTdocCodigo() == 0) {
            throw new Exception("El tipo de documento es nulo");
        }
        TiposDocumentos tiposDocumentos = tiposDocumentosDAO.consultarTipoDocumentoCodigo(clientes.getTiposDocumentos().getTdocCodigo());

        if (tiposDocumentos == null) {
            throw new Exception("El tipo de documento no existe");
        }

        Clientes entity = clientesDAO.consultarClienteId(clientes.getCliId());
        if (entity != null) {
            throw new Exception("Ya existe un cliente con ese ID");
        }

        clientesDAO.crearCliente(clientes);

    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void modificarCliente(Clientes clientes) throws Exception {
        if (clientes == null) {
            throw new Exception("El cliente es nulo");
        }
        if (clientes.getCliDireccion() == null || clientes.getCliDireccion().trim().equals("")) {
            throw new Exception("La Direccion es obligatoria");
        }
        if (clientes.getCliId() == 0) {
            throw new Exception("El ID es obligatorio");
        }
        if (clientes.getCliMail() == null || clientes.getCliMail().trim().equals("")) {
            throw new Exception("El Email es obligatorio");
        }
        if (clientes.getCliNombre() == null || clientes.getCliNombre().trim().equals("")) {
            throw new Exception("El nombre del cliente es obligatorio");
        }
        if (clientes.getCliTelefono() == null || clientes.getCliTelefono().trim().equals("")) {
            throw new Exception("El telefono del cliente es obligatorio");
        }
        if (clientes.getTiposDocumentos() == null || clientes.getTiposDocumentos().getTdocCodigo() == 0) {
            throw new Exception("El tipo de documento es nulo");
        }
        TiposDocumentos tiposDocumentos = tiposDocumentosDAO.consultarTipoDocumentoCodigo(clientes.getTiposDocumentos().getTdocCodigo());

        if (tiposDocumentos == null) {
            throw new Exception("El tipo de documento no existe");
        }

        Clientes entity = clientesDAO.consultarClienteId(clientes.getCliId());
        if (entity != null) {
            throw new Exception("Ya existe un cliente con ese ID");
        }

        entity.setCliDireccion(clientes.getCliDireccion());
        entity.setCliMail(clientes.getCliMail());
        entity.setCliNombre(clientes.getCliNombre());
        entity.setCliTelefono(clientes.getCliTelefono());

        clientesDAO.modificarCliente(entity);
    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void borrarCliente(Clientes clientes) throws Exception {
        if (clientes == null) {
            throw new Exception("El Cliente no pede ser nulo");
        }
        if (clientes.getCliId() == 0) {
            throw new Exception("El ID no puede ser cero");
        }

        clientesDAO.borrarCliente(clientes);
    }

    @Override
    @Transactional(readOnly = true)
    public Clientes consultarClienteId(long cliId) throws Exception {
        return clientesDAO.consultarClienteId(cliId);
    }

    @Override
    @Transactional(readOnly = true)
    public List<Clientes> consultarTodosLosClientes() throws Exception {
        return clientesDAO.consultarTodosLosClientes();
    }

}
